const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
// 连接方式
const server = require('http').createServer(app.callback())
const _ = require('underscore')
const io = require('socket.io')(server)

app.use(views(__dirname + '/views'))
const router = require('./routes/index')
app.use(router.routes(), router.allowedMethods())


// nsp 命名空间
// const nsp = io.of('/my-namespace')
// nsp.on('connection', function(socket) {
//   socket.join('myRoom')
//   let username = ''
//   socket.on('username', function(user) {  // 接受当前命名空间的消息
//     console.log(socket.nsp.name)
//     // nsp.to('myRoom').emit('username', user)  // 在当前命名空间下，向所有客户端发送消息
//     socket.emit('username', user)  // 在当前命名空间下，向 发送者本身 sender 发出消息
//     username = user
//   })
// })


// 建立websocket连接之后，客户端首先设置一下自己的用户名，
// 服务器端将用户名和socket.id的对应关系保存，当客户端A向B发送
// 私聊信息时，需要带上客户端B的用户名。我们通过B的用户名，解析
// 得到客户端B的socket.id，从socket集合中获取响应的socket，然后
// 再发送消息。
var hashName = new Array()
var name = ''
io.on('connection', function(socket){
  console.log('connection is established!');
  socket.on('setName',function (data) {
    name = data;  
    hashName[name] = socket.id;
    console.log(hashName);
  });
  socket.on('sayTo',function (data) {
    console.log(data)
    let toName = data.to;
    let toId = hashName[toName]
    if(toId){
      console.log(toId)
      // io.sockets.sockets  将返回所有在线的 socket 对象集合
      // nodejs 中的 underscore 扩展中的 findWhere 方法，
      // 可以使我们很容易在对象集合中，通过对象的属性值找到该对象并返回
      var toSocket = _.findWhere(io.sockets.sockets,{id:toId});
      console.log(toSocket)
      toSocket.emit('message', name, data.msg);
    }
  })
  socket.on('disconnect', function(){
    console.log('connection is disconnect!');
  });
});

// 监听端口
server.listen(3000, function() {
  console.log('listen on 3000')
})